package entity;

import control.ControleAnuncio;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;

@Entity
@Table
public class Anuncio {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    private int id_anuncio;
    @Column
    private int codigo;
    @Column
    private String titulo;
    @Column
    private String atividades;
    @Column
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date data_publicacao;
    @Column
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date data_validade;
    @Column
    private int carga_horaria;
    @Column
    private String setor;
    @Column
    private boolean efetivacao;
    @ManyToOne(targetEntity=Contato.class)
    @JoinColumn(name="id_contato")
    private Contato contato;
    @Column
    private float valor_remuneracao;
    @Column
    private String cidade;
    @Column
    private String bairro;
    @Column
    private String tipo_anuncio;
//    @Column
//    private ControleAnuncio controleAnuncio;    
    @ManyToOne(targetEntity=Remuneracao.class)
    @JoinColumn(name="id_remuneracao")
    private Remuneracao remuneracao;    
    @ManyToOne(targetEntity=Status.class)
    @JoinColumn(name="id_status")
    private List<Status> status;
    @OneToMany(mappedBy="anuncio")
    private List<Vaga> vaga;
    @ManyToMany
    @JoinTable(
            name = "anuncio_beneficio",
            joinColumns={@JoinColumn(name="id_anuncio", referencedColumnName="id_anuncio")},
            inverseJoinColumns={@JoinColumn(name="id_beneficio",referencedColumnName="id_beneficio")}
            )
    private List<Beneficio> beneficio;
    @ManyToMany
    @JoinTable(
            name = "anuncio_requesito",
            joinColumns={@JoinColumn(name="id_anuncio", referencedColumnName="id_anuncio")},
            inverseJoinColumns={@JoinColumn(name="id_requesito",referencedColumnName="id_requesito")}
            )
    private List<Requisito> requisito;
    

    public String getAtividades() {
        return atividades;
    }

    public void setAtividades(String atividades) {
        this.atividades = atividades;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public List<Beneficio> getBeneficio() {
        return beneficio;
    }

    public void setBeneficio(List<Beneficio> beneficio) {
        this.beneficio = beneficio;
    }

    public int getCarga_horaria() {
        return carga_horaria;
    }

    public void setCarga_horaria(int carga_horaria) {
        this.carga_horaria = carga_horaria;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public Contato getContato() {
        return contato;
    }

    public void setContato(Contato contato) {
        this.contato = contato;
    }

//    public ControleAnuncio getControleAnuncio() {
//        return controleAnuncio;
//    }
//
//    public void setControleAnuncio(ControleAnuncio controleAnuncio) {
//        this.controleAnuncio = controleAnuncio;
//    }
//
//    public List<Curso> getCurso() {
//        return curso;
//    }
//
//    public void setCurso(List<Curso> curso) {
//        this.curso = curso;
//    }

    public Date getData_publicacao() {
        return data_publicacao;
    }

    public void setData_publicacao(Date data_publicacao) {
        this.data_publicacao = data_publicacao;
    }

    public Date getData_validade() {
        return data_validade;
    }

    public void setData_validade(Date data_validade) {
        this.data_validade = data_validade;
    }

    public boolean isEfetivacao() {
        return efetivacao;
    }

    public void setEfetivacao(boolean efetivacao) {
        this.efetivacao = efetivacao;
    }

    public int getId_anuncio() {
        return id_anuncio;
    }

    public void setId_anuncio(int id_anuncio) {
        this.id_anuncio = id_anuncio;
    }

    public Remuneracao getRemuneracao() {
        return remuneracao;
    }

    public void setRemuneracao(Remuneracao remuneracao) {
        this.remuneracao = remuneracao;
    }

    public List<Requisito> getRequisito() {
        return requisito;
    }

    public void setRequisito(List<Requisito> requisito) {
        this.requisito = requisito;
    }

    public String getSetor() {
        return setor;
    }

    public void setSetor(String setor) {
        this.setor = setor;
    }

    public List<Status> getStatus() {
        return status;
    }

    public void setStatus(List<Status> status) {
        this.status = status;
    }

    public String getTipo_anuncio() {
        return tipo_anuncio;
    }

    public void setTipo_anuncio(String tipo_anuncio) {
        this.tipo_anuncio = tipo_anuncio;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public List<Vaga> getVaga() {
        return vaga;
    }

    public void setVaga(List<Vaga> vaga) {
        this.vaga = vaga;
    }

    public float getValor_remuneracao() {
        return valor_remuneracao;
    }

    public void setValor_remuneracao(float valor_remuneracao) {
        this.valor_remuneracao = valor_remuneracao;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Anuncio other = (Anuncio) obj;
        if (this.id_anuncio != other.id_anuncio) {
            return false;
        }
        if (this.codigo != other.codigo) {
            return false;
        }
        if ((this.titulo == null) ? (other.titulo != null) : !this.titulo.equals(other.titulo)) {
            return false;
        }
        if ((this.atividades == null) ? (other.atividades != null) : !this.atividades.equals(other.atividades)) {
            return false;
        }
        if (this.data_publicacao != other.data_publicacao && (this.data_publicacao == null || !this.data_publicacao.equals(other.data_publicacao))) {
            return false;
        }
        if (this.data_validade != other.data_validade && (this.data_validade == null || !this.data_validade.equals(other.data_validade))) {
            return false;
        }
        if (this.carga_horaria != other.carga_horaria) {
            return false;
        }
        if ((this.setor == null) ? (other.setor != null) : !this.setor.equals(other.setor)) {
            return false;
        }
        if (this.efetivacao != other.efetivacao) {
            return false;
        }
        if (this.contato != other.contato && (this.contato == null || !this.contato.equals(other.contato))) {
            return false;
        }
        if (Float.floatToIntBits(this.valor_remuneracao) != Float.floatToIntBits(other.valor_remuneracao)) {
            return false;
        }
        if ((this.cidade == null) ? (other.cidade != null) : !this.cidade.equals(other.cidade)) {
            return false;
        }
        if ((this.bairro == null) ? (other.bairro != null) : !this.bairro.equals(other.bairro)) {
            return false;
        }
        if ((this.tipo_anuncio == null) ? (other.tipo_anuncio != null) : !this.tipo_anuncio.equals(other.tipo_anuncio)) {
            return false;
        }
//        if (this.controleAnuncio != other.controleAnuncio && (this.controleAnuncio == null || !this.controleAnuncio.equals(other.controleAnuncio))) {
//            return false;
//        }
//        if (this.curso != other.curso && (this.curso == null || !this.curso.equals(other.curso))) {
//            return false;
//        }
        if (this.remuneracao != other.remuneracao && (this.remuneracao == null || !this.remuneracao.equals(other.remuneracao))) {
            return false;
        }
//        if (!Arrays.deepEquals(this.status, other.status)) {
//            return false;
//        }
        if (this.vaga != other.vaga && (this.vaga == null || !this.vaga.equals(other.vaga))) {
            return false;
        }
        if (this.beneficio != other.beneficio && (this.beneficio == null || !this.beneficio.equals(other.beneficio))) {
            return false;
        }
        if (this.requisito != other.requisito && (this.requisito == null || !this.requisito.equals(other.requisito))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + this.id_anuncio;
        hash = 29 * hash + this.codigo;
        hash = 29 * hash + (this.titulo != null ? this.titulo.hashCode() : 0);
        hash = 29 * hash + (this.atividades != null ? this.atividades.hashCode() : 0);
        hash = 29 * hash + (this.data_publicacao != null ? this.data_publicacao.hashCode() : 0);
        hash = 29 * hash + (this.data_validade != null ? this.data_validade.hashCode() : 0);
        hash = 29 * hash + this.carga_horaria;
        hash = 29 * hash + (this.setor != null ? this.setor.hashCode() : 0);
        hash = 29 * hash + (this.contato != null ? this.contato.hashCode() : 0);
        hash = 29 * hash + Float.floatToIntBits(this.valor_remuneracao);
        hash = 29 * hash + (this.cidade != null ? this.cidade.hashCode() : 0);
        hash = 29 * hash + (this.bairro != null ? this.bairro.hashCode() : 0);
        hash = 29 * hash + (this.tipo_anuncio != null ? this.tipo_anuncio.hashCode() : 0);
//        hash = 29 * hash + (this.controleAnuncio != null ? this.controleAnuncio.hashCode() : 0);
//        hash = 29 * hash + (this.curso != null ? this.curso.hashCode() : 0);
        hash = 29 * hash + (this.remuneracao != null ? this.remuneracao.hashCode() : 0);
//        hash = 29 * hash + Arrays.deepHashCode(this.status);
        hash = 29 * hash + (this.vaga != null ? this.vaga.hashCode() : 0);
        hash = 29 * hash + (this.beneficio != null ? this.beneficio.hashCode() : 0);
        hash = 29 * hash + (this.requisito != null ? this.requisito.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "Anuncio{" + "id_anuncio=" + id_anuncio + "codigo=" + codigo + "titulo=" + titulo + "atividades=" + atividades + "data_publicacao=" + data_publicacao + "data_validade=" + data_validade + "carga_horaria=" + carga_horaria + "setor=" + setor + "efetivacao=" + efetivacao + "contato=" + contato + "valor_remuneracao=" + valor_remuneracao + "cidade=" + cidade + "bairro=" + bairro + "tipo_anuncio=" + tipo_anuncio /*+ "controleAnuncio=" + controleAnuncio + "curso=" + curso*/ + "remuneracao=" + remuneracao + "status=" + status + "vaga=" + vaga + "beneficio=" + beneficio + "requisito=" + requisito + '}';
    }
}
